package com.gem.day14;

import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

/**
 * 本类用来演示Java nio
 * 
 * 缓存,通道,选择器
 * 
 * @author easonsy
 * 2020年8月8日 上午10:01:19
 */
public class NioDemo {
	public static void main(String[] args) {
		readFile("D:\\day12笔记.txt");
	}

	/**
	 * 读取文件
	 */
	public static void readFile(String filepath) {
		//1.创建节点流对象
		//2.创建通道
		//注意: 如果使用传统的finally来关闭资源,则要先关闭通道,再关闭流![先打开的后关闭]
		try (FileInputStream is = new FileInputStream(filepath); FileChannel fileChannel = is.getChannel()) {
			//3.创建缓冲区
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			//4.如果是文本文件,需要创建解码器
			CharsetDecoder decoder = Charset.defaultCharset().newDecoder();
			//5.循环把通道中的数据读取到缓冲区,如果读取到-1,表示读取完毕
			while ((fileChannel.read(buffer)) != -1) {
				//6.确定缓冲区起始点
				buffer.flip();
				//7.对缓冲区数据进行解码[避免乱码问题]
				CharBuffer decode = decoder.decode(buffer);
				System.out.println(decode.toString());
				//8.清空缓冲区
				buffer.clear();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
